package kr.pe.johnkim.waiting.mobile.service;

import kr.pe.johnkim.waiting.mobile.domain.WaitingUser;

import java.util.List;

/**
 * Waiting 사용자 관련 service 인터페이스 이다.
 *
 * @author : John_Kim <cale9797@gmail.com>
 * @date : 13. 4. 10.
 */
public interface WaitingUserService {

    /**
     * 이미 등록된 사용자 대기가 있는지 확인한다.
     *
     * @param waitingUser
     * @return
     */
    public WaitingUser selectDuplicationUser(WaitingUser waitingUser);

    /**
     * 사용자가 대기 등록된 가맹점의 정보를 가져 온다.
     *
     * @param waitingUser
     * @return
     */
    public WaitingUser selectUserMerchantInformation(WaitingUser waitingUser);

    /**
     * (오늘) 다음 대기번호를 가져 온다.
     * 한번 대기 등록되었던 갯수를 모두 가져 온다.
     * 이 숫자에 1을 더해서 대기번호로 사용 한다.
     *
     * @param waitingUser
     * @return
     */
    public WaitingUser selectNumberWaiting(WaitingUser waitingUser);

    /**
     * 대기를 등록 한다.
     *
     * @param waitingUser
     */
    public void registerUser(WaitingUser waitingUser);

    /**
     * 다른 대기자가 없을 경우 해당 사용자를 대기자로 등록하고 next_turn_yn 을 업데이트 한다.
     *
     * @param waitingUser
     */
    public void registerUserAndUpdateNextTurnYn(WaitingUser waitingUser);

    /**
     * 등록된 대기 정보를 가져 온다.
     *
     * @param waitingUser
     * @return
     */
    public WaitingUser selectUserInformation(WaitingUser waitingUser);

    /**
     * 사용자 id 로 등록된 대기 정보를 가져 온다.
     *
     * @param waitingUser
     * @return
     */
    public WaitingUser selectUserInformationById(WaitingUser waitingUser);

    /**
     * 대기를 취소 한다. 대기를 등록했다가 취소하는 경우 비활성화 한다.
     *
     * @param waitingUser
     */
    public void updateDeactivateUser(WaitingUser waitingUser);

    /**
     * 대기를 취소 한다. 다음 대기자의 next_turn_yn 의 값을 'Y' 로 업데이트 한다.
     *
     * @param waitingUser
     */
    public void updateDeactivateUserAndUserNextTurnYn(WaitingUser waitingUser);

    /**
     * 대기 목록을 가져 온다. iPad 에 출력 한다.
     *
     * @param waitingUser
     * @return
     */
    public List<WaitingUser> selectUserList(WaitingUser waitingUser);

    /**
     * (오늘) 총 대기 인원 숫자를 가져 온다. iPad 에 출력 한다.
     *
     * @param waitingUser
     * @return
     */
    public WaitingUser selectUserTotalCount(WaitingUser waitingUser);

    /**
     * 현재 대기자를 입장 처리 한다.
     *
     * @param waitingUser
     */
    public void updateUserAdmissionYn(WaitingUser waitingUser);

    /**
     * 다음 대기자의 next_turn_yn 의 값을 'Y' 로 업데이트 한다.
     *
     * @param waitingUser
     */
    public void updateUserNextTurnYn(WaitingUser waitingUser);

    /**
     * 현재 대기자를 입장 처리 하고 다음 대기자의 next_turn_yn 의 값을 'Y' 로 업데이트 한다.
     *
     * @param waitingUser
     */
    public void updateUserAdmissionYnAndUserNextTurnYn(WaitingUser waitingUser);

    /**
     * 다음 대기자를 찾는다.
     *
     * @param waitingUser
     * @return
     */
    public WaitingUser selectUserNextTurn(WaitingUser waitingUser);

    /**
     * 내 앞으로 남은 대기자 총 수를 가져 온다.
     *
     * @param waitingUser
     * @return
     */
    public WaitingUser selectRemainUserTotalCountBeforeMe(WaitingUser waitingUser);

    /**
     * 사용자가 대기 등록된 적이 있었는지 확인한다.
     * 추천 로직에서 사용한다.
     *
     * @param waitingUser
     * @return
     */
    public WaitingUser selectUserRegistered(WaitingUser waitingUser);

    /**
     * 오늘 총 등록팀과 등록인원 정보를 가져 온다.
     *
     * @param waitingUser
     * @return
     */
    public List<WaitingUser> selectRegisterTeamAndUser(WaitingUser waitingUser);

    /**
     * 오늘 가장 최근에 등록/입장한 고객 2팀의 목록을 가져 온다.
     *
     * @param waitingUser
     * @return
     */
    public List<WaitingUser> selectRecentAdmissionUserList(WaitingUser waitingUser);

    /**
     * 오늘 등록/입장한 고객 목록을 가져 온다.
     *
     * @param waitingUser
     * @return
     */
    public List<WaitingUser> selectTodayAdmissionUserList(WaitingUser waitingUser);
}
